#ifndef MAINWINDOW_H
#define MAINWINDOW_H

//Qt виджеты
#include <QMainWindow>
#include <QStatusBar>
#include <QLabel>
#include <QMenu> 
#include <QMenuBar>
#include <QColor>
#include <QCursor>
#include <QPen>
#include <QBrush>
#include <QMessageBox>
#include <QFont>
#include <QSlider>
#include <QPalette>
#include <QAction>
#include <QTabWidget>
#include <QSizePolicy>
#include <QDebug>

//Главные виджеты окна
#include "../mainWidgets/chartTray/chartTray.h"
#include "../mainWidgets/chartParts/chartParts.h"
#include "../mainWidgets/result/result.h"
#include "../mainWidgets/groupControl/groupControl.h"
#include "../mainWidgets/termsAndMaterials/termsAndMaterials.h"
#include "../mainWidgets/toolParts/toolParts.h"
#include "../mainWidgets/report/report.h"

//Диалоговые окна
#include "../dialogs/concreteDialog/concreteDialog.h"
#include "../dialogs/typeUpsideDialog/typeUpsideDialog.h"
#include "../dialogs/regionDialog/regionDialog.h"
#include "../dialogs/mapQ20Dialog/mapQ20Dialog.h"
#include "../dialogs/aboutAuthorsDialog/aboutAuthorsDialog.h"
#include "../dialogs/classConcreteDialog/classConcreteDialog.h"
#include "../dialogs/reportDialog/reportDialog.h"

//Класс расчета
#include "../trayToolKit/trayToolKit.h"

#include "defines.h"

class MainWindow : public QMainWindow {
 Q_OBJECT
public:
  MainWindow();

  void calcConQ(double newB, double newH, int angle, double newI);
  void calcIcr(double newB, double newH, int angle, double newI);
  void calcConRainq(int newQ20, double newF, double newP);
  void calcQr(double newB, double newHr, int angle, double newIr);

  bool isChanges() { return isChanged; };

protected:
  GroupControl * grControl;
  QLabel * label;
  QStatusBar * statusBar;
  QLabel * quickMessage;
  ChartTray * chart;
  ChartParts * chartParts;
  TermsAndMaterials * tam;
  Result * result;
  TrayToolKit * ttk;
  Report * report;
  QTabWidget * tabs;

  QLabel * toolLab;
  ToolParts * toolItem;

  QWidget * listTray;
  QWidget * listParts;

  QPalette palette;

  //Был изменен
  bool isChanged;

  //Конвертирование кодировки
  QTextCodec * russianCodec;

//ДИАЛОГИ
  //Диалог для смены облицовки
  ConcreteDialog * dConcrete;
  //Диалог для смены типа поверхности
  TypeUpsideDialog * dTypeUpside;
  //Диалог для смены региона
  RegionDialog * dRegion;
  //Карта
  MapQ20Dialog * dMap;
  //Про авторов
  AboutAuthorsDialog * dAuthors;
  //Класс бетона
  ClassConcreteDialog * dClassConcrete;
  //Отчет
  ReportDialog * dReport;

  qreal opacity;

  void closeEvent(QCloseEvent * event);
  void wheelEvent(QWheelEvent * event);

  //Убирает незначащие цифры после запятой
  double toPrec(double num) { double d = fmod(num, 0.01); return  num - d + double(rint(d * 1000))/1000; };

public slots:
  //Изменить тип лотка
  void setTrayType(int newTrayType);
  //Выводит новое сообщение в статус бар
  void showMessage(const QString & text);
  //Пересчет
  void reCalc();
  //Изменения
  void setChanged(bool newVal = true);

//Обработка результата диалога
  void updateConcrete(int num);
  void updateTypeUpside(int num);
  void updateRegion(int reg);
  void updateClassConcrete(int num);

protected slots:
//Вычислить расход воды/дождя с изменившимся параметром
  void calcWithNewN(double newN);
  void calcWithNewRegion(int newRegion);
  void calcWithNewRunnel(double newRunnel);
  void calcWithNewB(double newB);
  void calcWithNewH(double newH);
  void calcWithNewAngle(int newAngle);
  void calcWithNewI(double newI);
  void calcWithNewQ20(int newQ20);
  void calcWithNewF(double newF);
  void calcWithNewP(double newP);
  void calcWithNewTime(int newTime);
  void calcWithNewIr(double newIr);
  void calcWithNewHr(double newHr);

//Создание диалогов
  void createDConcrete();
  void createDTypeUpside();
  void createDRegion();
  void createDMap();
  void createDAuthors();
  void createDClassConcrete();
  void createDReport(const QString & text);
//   void createDLicense();

  //Создание отчета
  void createReport();

  //Проверка на изменения перед открытием файла
  void checkChanged();

  //Закрыть все диалоги
  void closeDialogs();

  //Вывести сообщение о значениях графиков
  void showColorCharts(int numTab);

private:
//ДЕЙСТВИЯ
  //Загрузить xml файл
  QAction * importXmlFileAction;
  //Сохранить xml файл
  QAction * exportXmlFileAction;
  //Сохранить xml файл как
  QAction * exportXmlFileAsAction;
  //Выгрузить xml шаблон 
  QAction * exportXmlPatternAction;
  //Выход 
  QAction * exitAction;
  //Справка
  QAction * helpAction;
  //Обозначение
  QAction * markAction;
  //Про Qt
  QAction * aboutQtAction;
  //Авторы
  QAction * licenseAction;
  //Авторы
  QAction * aboutAuthorsAction;

  int mod(int num) { if (num < 0) return (0-num); else return num; };
  //Создает меню
  void createMenus();
  //Создает меню
  void createStatusBar();
  //Создает действия
  void createActions();


//Работа со значениями ячеек таблицы переменных
  //Класс бетона
  double getN();
  void setN(double newVal);
  //Регион
  int getRegion();
  void setRegion(int newVal);
  //Период
  double getPeriod();
  void setPeriod(double newVal);
  //Гидравлический уклон
  double getHydraInc();
  void setHydraInc(double newVal);
  //Площадь стока
  double getF();
  void setF(double newVal);
  //Интенсивность дождя
  int getQ20();
  void setQ20(int newVal);
  //Интенсивность дождя
  double getCofRunnel();
  void setCofRunnel(double newVal);
  //Продолжительность дождя
  int getTimeRain();
  void setTimeRain(int newVal);
  //Расчетный гидравлический уклон
  double getIr();
  void setIr(double newVal);
  //Расчетный высота
  double getHr();
  void setHr(double newVal);

  //Перевод угла в радианы
  double to_rad(int gr)    { return ((gr * PI) / 180); };
  //Перевод радиан в угол
  int to_gr(double rad)    { return ( int( (rad *180)/PI) ); };

  //Раздел меню File
  QMenu *fileMenu;

}; //class MainWindow : public QMainWindow

#endif
